library(dplyr) #ManipulaciĂłn de datos (filtrar, agrupar, resumir, unir)
library(ggplot2) #Visualización de datos con gráficos profesionales
library(readr) #Lectura rápida y limpia de archivos CSV
library(stringr) #Manejo de texto y expresiones regulares (ej. limpiar paréntesis)
library(tidyr) #Transformar y reorganizar datos (ej. pivotar) -> trazado ambas variables como series separadas con leyendas limpias en ggplot2
library(jsonlite) #Leer y escribir archivos JSON
library(corrplot) #VisualizaciĂłn de matrices de correlaciĂłn
library(scales) #Escalas y transformaciones para gráficos
library(plotly)
# Cargar datos de generaciĂłn por comunidad
df_comunidades <- read_csv("data/generacion_todas_comunidades.csv")
## Rows: 3480 Columns: 4
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr (2): variable, comunidad
## dbl (1): valor
## date (1): fecha
##
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
# Filtrar solo energĂa hidráulica
df_hidraulica_comunidades <- df_comunidades %>%
filter(variable == "Hidráulica")
# Agrupar por comunidad y calcular la suma total de energĂa hidráulica
df_comunidades_hidraulica <- df_hidraulica_comunidades %>%
group_by(comunidad) %>%
summarise(total_hidraulica = sum(valor, na.rm = TRUE)) %>%
arrange(desc(total_hidraulica))
# Visualizar en gráfico de barras
ggplot(df_comunidades_hidraulica, aes(x = reorder(comunidad, -total_hidraulica), y = total_hidraulica)) +
geom_bar(stat = "identity", fill = "steelblue") +
labs(title = "ProducciĂłn total de energĂa hidráulica por comunidad",
x = "Comunidad AutĂłnoma",
y = "Total energĂa hidráulica (GWh)") +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1))
ggplot(df_hidraulica_comunidades, aes(x = reorder(comunidad, valor, median, na.rm = TRUE), y = valor)) +
geom_boxplot(fill = "lightblue", outlier.color = "red") +
labs(title = "DistribuciĂłn mensual de energĂa hidráulica por comunidad",
x = "Comunidad AutĂłnoma",
y = "EnergĂa hidráulica (GWh)") +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1))
Tras realizar un análisis exploratorio de la generaciĂłn hidráulica por comunidad autĂłnoma en España, observamos que Galicia es la comunidad con mayor producciĂłn total de energĂa hidráulica durante el periodo analizado. Esta regiĂłn destaca tanto por la abundancia de precipitaciones como por la existencia de numerosos embalses y recursos hidrográficos aprovechables para la generaciĂłn de electricidad.
Para llevar a cabo el cruce con los datos meteorológicos, ha sido necesario seleccionar una estación meteorológica representativa, ya que la AEMET no ofrece datos agregados a nivel autonómico. En este caso, se ha optado por utilizar los registros correspondientes a la provincia de A Coruña, que forma parte de Galicia y cuenta con un clima atlántico húmedo, caracterizado por precipitaciones abundantes y repartidas durante todo el año. Esto la convierte en un territorio idóneo para analizar la influencia de la lluvia sobre la producción hidráulica.
La elección de Galicia (y concretamente A Coruña) se justifica, por tanto, por:
Para el análisis de la relación entre precipitaciones y generación hidráulica en Galicia, se ha seleccionado la estación meteorológica A Coruña Aeropuerto (código AEMET: 1387E). Esta estación ha sido elegida por los siguientes motivos:
# Rutas a los JSON descargados
ruta_2023 <- "data/aemet/GALICIA/2023.json"
ruta_2024 <- "data/aemet/GALICIA/2024.json"
# Cargar y convertir a data frame
datos_2023 <- fromJSON(ruta_2023)
datos_2024 <- fromJSON(ruta_2024)
df_2023 <- as.data.frame(datos_2023, stringsAsFactors = FALSE)
df_2024 <- as.data.frame(datos_2024, stringsAsFactors = FALSE)
# Convertir la columna 'fecha' al formato Date
df_2023 <- df_2023 %>% mutate(fecha = as.Date(paste0(fecha, "-01")))
df_2024 <- df_2024 %>% mutate(fecha = as.Date(paste0(fecha, "-01")))
# Ordenar por fecha
df_2023 <- arrange(df_2023, fecha)
df_2024 <- arrange(df_2024, fecha)
print(df_2023)
print(df_2024)
Clásico error en los datos de AEMET: aparece un registro con fecha = 2023-13-01 o 2024-13-01, lo cual es un valor inválido ya que no existe el mes 13. Este tipo de entrada suele ser un resumen anual agregado, no un mes real.
# Eliminar la ultima fila de ambos datasets
df_2023 <- df_2023[-nrow(df_2023), ]
df_2024 <- df_2024[-nrow(df_2024), ]
đź§ľ JustificaciĂłn tĂ©cnica: eliminaciĂłn del dĂa entre parĂ©ntesis En los datos meteorolĂłgicos proporcionados por la AEMET, muchas variables extremas mensuales (como p_max, ta_max, ta_min, etc.) incluyen entre parĂ©ntesis el dĂa del mes en que ese valor se registrĂł, por ejemplo: p_max = “20.9(19)”, lo que indica que la precipitaciĂłn máxima fue de 20.9 mm y se produjo el dĂa 19 del mes.
Para el análisis tĂ©cnico planteado en este proyecto —centrado en estudiar la relaciĂłn entre variables climáticas y generaciĂłn energĂ©tica a nivel mensual—, hemos optado por descartar el valor del dĂa ya que el estudio se realiza a escala mensual, tanto para los datos climáticos como para los energĂ©ticos. Conservar el dĂa exacto de un evento puntual no aporta valor adicional a este nivel de análisis.
# Función para limpiar los valores con paréntesis
limpiar_valor <- function(x) {
as.numeric(str_extract(x, "^[0-9.]+"))
}
# Aplicar limpieza a todas las columnas menos fecha e indicativo
columnas_a_limpiar <- setdiff(names(df_2023), c("fecha", "indicativo"))
df_2023[columnas_a_limpiar] <- lapply(df_2023[columnas_a_limpiar], limpiar_valor)
df_2024[columnas_a_limpiar] <- lapply(df_2024[columnas_a_limpiar], limpiar_valor)
# Unir ambos años y guardar el combinado
df_clima_coruna <- bind_rows(df_2023, df_2024) %>%
arrange(fecha)
write_csv(df_clima_coruna, "data/aemet/GALICIA/clima_coruna.csv")
Variables AEMET - Hidráulica
Ahora que tenemos listo el dataset limpio de clima para A Coruña (Galicia), vamos a hacer un pequeño análisis exploratorio para entender cómo se comporta el tiempo en Galicia en términos de precipitaciones y otras variables clave.
df_clima <- read_csv("data/aemet/GALICIA/clima_coruna.csv", show_col_types = FALSE)
ggplot(df_clima, aes(x = fecha, y = p_mes)) +
geom_line(color = "blue") +
geom_point(color = "darkblue") +
scale_x_date(date_labels = "%b %Y", date_breaks = "1 month") +
labs(title = "Precipitación mensual en A Coruña",
x = "Mes", y = "PrecipitaciĂłn (mm)") +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1))
ggplot(df_clima, aes(x = fecha, y = n_llu)) +
geom_col(fill = "steelblue") +
scale_x_date(date_labels = "%b %Y", date_breaks = "1 month") +
labs(title = "NĂşmero de dĂas de lluvia por mes en A Coruña",
x = "Mes", y = "DĂas de lluvia") +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1))
## Warning: Removed 1 row containing missing values or values outside the scale range
## (`geom_col()`).
#combinar datos df_clima por fecha con df_hidraulica_comunidades
df_clima <- read_csv("data/aemet/GALICIA/clima_coruna.csv", show_col_types = FALSE)
df_comunidades <- read_csv("data/generacion_todas_comunidades.csv")
## Rows: 3480 Columns: 4
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr (2): variable, comunidad
## dbl (1): valor
## date (1): fecha
##
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
# Filtrar solo hidráulica y Galicia
df_hidraulica_galicia <- df_comunidades %>%
filter(variable == "Hidráulica", comunidad == "Galicia") %>%
select(fecha, energia_hidraulica = valor)
# Unir datasets por fecha
df_merged <- df_clima %>%
inner_join(df_hidraulica_galicia, by = "fecha")
# Verificar que ha funcionado
print(df_merged)
## # A tibble: 24 Ă— 42
## fecha indicativo p_max n_cub hr n_gra n_fog inso q_max nw_55 q_mar
## <date> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 2023-01-01 1387 20.9 10 79 2 7 3.8 1022. 11 1024.
## 2 2023-02-01 1387 9.8 8 71 1 10 6.8 1025. 0 1026.
## 3 2023-03-01 1387 13.7 8 72 0 5 6.2 1015 13 1017.
## 4 2023-04-01 1387 9.6 7 75 0 6 7.7 1018. 1 1018.
## 5 2023-05-01 1387 6.9 4 NA 0 2 8.3 1016. 2 1020.
## 6 2023-06-01 1387 11.6 7 77 1 10 8.6 1014. 0 1016.
## 7 2023-07-01 1387 3.1 3 73 0 5 8.5 1012. 2 1019.
## 8 2023-08-01 1387 3.4 4 73 NA NA 8.2 1015 1 1019.
## 9 2023-09-01 1387 16.1 3 76 0 9 7.1 1012. 4 1015.
## 10 2023-10-01 1387 37 7 77 0 9 4.8 1016. 12 1011
## # ℹ 14 more rows
## # ℹ 31 more variables: q_med <dbl>, tm_min <dbl>, ta_max <dbl>, ts_min <dbl>,
## # nt_30 <dbl>, nv_0050 <dbl>, n_des <dbl>, w_racha <dbl>, np_100 <dbl>,
## # n_nub <dbl>, p_sol <dbl>, nw_91 <dbl>, np_001 <dbl>, ta_min <dbl>,
## # w_rec <dbl>, e <dbl>, np_300 <dbl>, nv_1000 <dbl>, p_mes <dbl>,
## # n_llu <dbl>, n_tor <dbl>, w_med <dbl>, nt_00 <dbl>, ti_max <dbl>,
## # n_nie <dbl>, tm_mes <dbl>, tm_max <dbl>, nv_0100 <dbl>, q_min <dbl>, …
🎯 Objetivo
Estudiar si existe una relaciĂłn tĂ©cnica entre la lluvia (precipitaciĂłn) y la energĂa hidráulica generada en Galicia, usando datos reales de AEMET y REE (2023–2024).
# Correlación básica
cor.test(df_merged$p_mes, df_merged$energia_hidraulica, method = "spearman")
##
## Spearman's rank correlation rho
##
## data: df_merged$p_mes and df_merged$energia_hidraulica
## S = 570, p-value = 3.579e-05
## alternative hypothesis: true rho is not equal to 0
## sample estimates:
## rho
## 0.7521739
cor.test(df_merged$n_llu, df_merged$energia_hidraulica, method = "spearman")
## Warning in cor.test.default(df_merged$n_llu, df_merged$energia_hidraulica, :
## Cannot compute exact p-value with ties
##
## Spearman's rank correlation rho
##
## data: df_merged$n_llu and df_merged$energia_hidraulica
## S = 1170, p-value = 0.04492
## alternative hypothesis: true rho is not equal to 0
## sample estimates:
## rho
## 0.4219321
cor.test(df_merged$np_010, df_merged$energia_hidraulica, method = "spearman")
## Warning in cor.test.default(df_merged$np_010, df_merged$energia_hidraulica, :
## Cannot compute exact p-value with ties
##
## Spearman's rank correlation rho
##
## data: df_merged$np_010 and df_merged$energia_hidraulica
## S = 752.95, p-value = 0.000317
## alternative hypothesis: true rho is not equal to 0
## sample estimates:
## rho
## 0.6726317
cor.test(df_merged$p_max, df_merged$energia_hidraulica, method = "spearman")
##
## Spearman's rank correlation rho
##
## data: df_merged$p_max and df_merged$energia_hidraulica
## S = 672, p-value = 0.0001639
## alternative hypothesis: true rho is not equal to 0
## sample estimates:
## rho
## 0.7078261
# Correlación básica
df_cor <- df_merged %>%
select(p_mes, n_llu, np_010, p_max, energia_hidraulica)
cor_matrix <- cor(df_cor, use = "complete.obs", method = "spearman")
corrplot(cor_matrix, method = "color", type = "upper", tl.col = "black")
1. Resumen del resultado estadĂstico Se ha aplicado el coeficiente de
correlaciĂłn de rangos de Spearman entre la precipitaciĂłn mensual total
(p_mes) y la energĂa hidráulica generada en Galicia
(energia_hidraulica), obteniendo un valor de rho = 0.75 con un p-valor
< 0.001. Esto indica una correlaciĂłn positiva fuerte y
estadĂsticamente significativa, lo que sugiere que los meses con mayor
precipitaciĂłn tienden a coincidir con una mayor producciĂłn
hidráulica.
JustificaciĂłn del uso de Spearman Se ha utilizado Spearman en lugar de Pearson ya que los datos no presentan una distribuciĂłn perfectamente normal y la relaciĂłn entre variables puede no ser lineal estricta, sino monĂłtonamente creciente.
VisualizaciĂłn profesional: mapa de correlaciones El heatmap confirma que las precipitaciones acumuladas mensualmente (p_mes) y las lluvias significativas (np_010) son las mejores variables climáticas para explicar la variaciĂłn en la energĂa hidráulica. Otras variables, como el nĂşmero de dĂas de lluvia (n_llu) o eventos extremos puntuales (p_max), tienen menor impacto correlacional.
La producciĂłn de energĂa hidráulica depende directamente del caudal disponible en los embalses, y este está influenciado a su vez por el volumen total de precipitaciones mensuales. La fuerte correlaciĂłn detectada en Galicia —una comunidad con alta capacidad hidroelĂ©ctrica— valida esta dependencia directa. Variables como el nĂşmero de dĂas con lluvia (n_llu) o el nĂşmero de dĂas con precipitaciones superiores a 10 mm (np_010) tambiĂ©n muestran correlaciones positivas relevantes, aunque ligeramente menores.
# Escala de transformaciĂłn para doble eje
factor_escala <- max(df_merged$energia_hidraulica, na.rm = TRUE) / max(df_merged$p_mes, na.rm = TRUE)
# Crear dataframe largo para facilitar la leyenda
df_plot <- df_merged %>%
select(fecha, energia_hidraulica, p_mes) %>%
mutate(p_mes_escalado = p_mes * factor_escala) %>% #escalado
select(fecha, energia_hidraulica, p_mes_escalado) %>%
pivot_longer(cols = c("energia_hidraulica", "p_mes_escalado"),
names_to = "variable",
values_to = "valor")
# Etiquetas más legibles
df_plot$variable <- recode(df_plot$variable,
"energia_hidraulica" = "EnergĂa hidráulica (GWh)",
"p_mes_escalado" = "PrecipitaciĂłn mensual (mm)")
# Gráfico con leyenda
ggplot(df_plot, aes(x = fecha, y = valor, color = variable, linetype = variable)) +
geom_line(size = 1.2) +
scale_color_manual(values = c("EnergĂa hidráulica (GWh)" = "darkblue",
"PrecipitaciĂłn mensual (mm)" = "darkgreen")) +
scale_linetype_manual(values = c("EnergĂa hidráulica (GWh)" = "solid",
"PrecipitaciĂłn mensual (mm)" = "dashed")) +
scale_y_continuous(
name = "EnergĂa hidráulica (GWh)",
sec.axis = sec_axis(~ . / factor_escala, name = "PrecipitaciĂłn mensual (mm)")
) +
scale_x_date(date_labels = "%b %Y", date_breaks = "1 month") +
labs(title = "RelaciĂłn mensual entre energĂa hidráulica y precipitaciĂłn en Galicia",
x = "Mes", color = "Variable", linetype = "Variable") +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1))
## Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
## ℹ Please use `linewidth` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
- 🔍 ¿Qué pasa en ene–mar 2024?
Aunque las precipitaciones bajan (lĂnea verde), la energĂa hidráulica se mantiene alta (lĂnea azul). Esto ocurre porque los embalses estaban ya llenos desde los meses anteriores (nov–dic 2023), que sĂ fueron muy lluviosos. La energĂa hidráulica no responde al instante a la lluvia caĂda, sino al agua embalsada acumulada.
AquĂ lo más probable es que: Los embalses aĂşn estĂ©n vacĂos tras un verano muy seco (jun–ago 2024). El agua caĂda en septiembre no sea suficiente aĂşn para restablecer niveles de producciĂłn (hay un “retraso” en la respuesta). Además, parte de esa lluvia puede haber ido a relleno de acuĂferos, absorciĂłn del terreno o desembalses previos.
Aunque existe una correlación general entre precipitaciones y generación hidráulica, el análisis mensual muestra que el sistema presenta cierta inercia hidrológica, de forma que la producción no responde inmediatamente a cada pico de lluvia. Los meses de enero-marzo de 2024 muestran cómo una alta producción se mantiene tras meses previos muy húmedos, mientras que en septiembre-octubre, el efecto de la lluvia aún no se traduce en generación inmediata.
De forma interactiva con plotly, se puede observar la evoluciĂłn de ambas variables a lo largo del tiempo, facilitando la identificaciĂłn de patrones estacionales y tendencias:
ggplot_plot <- ggplot(df_merged, aes(x = fecha)) +
geom_line(aes(y = energia_hidraulica, color = "EnergĂa hidráulica")) +
geom_line(aes(y = p_mes * (max(energia_hidraulica)/max(p_mes)), color = "PrecipitaciĂłn")) +
scale_color_manual(values = c("EnergĂa hidráulica" = "darkblue", "PrecipitaciĂłn" = "green")) +
labs(title = "EnergĂa hidráulica vs PrecipitaciĂłn - Galicia", x = "Fecha", y = "Escalado") +
theme_minimal()
ggplotly(ggplot_plot)
Aunque el análisis general muestra una correlaciĂłn positiva entre las precipitaciones mensuales y la generaciĂłn de energĂa hidráulica, una observaciĂłn más detallada revela que esta relaciĂłn no es lineal ni inmediata.
En concreto, se observa que:
Durante los meses de enero a marzo de 2024, la generación hidráulica se mantiene alta a pesar de una bajada en las precipitaciones, debido al efecto acumulado de lluvias intensas en los meses previos (noviembre y diciembre). En septiembre–octubre de 2024, se registran picos de precipitación sin que ello se traduzca en un aumento proporcional de generación, lo que sugiere que el sistema necesita tiempo para recuperar caudal útil, o que ya ha alcanzado su capacidad operativa.
Para reflejar esta realidad, se ha ajustado un modelo de regresiĂłn lineal y otro de regresiĂłn polinĂłmica de segundo grado:
# REGRESIÓN LINEAL SIMPLE
modelo_lineal <- lm(energia_hidraulica ~ p_mes, data = df_merged)
summary(modelo_lineal) # Muestra coeficientes, R², p-valores
##
## Call:
## lm(formula = energia_hidraulica ~ p_mes, data = df_merged)
##
## Residuals:
## Min 1Q Median 3Q Max
## -832282 -251800 -42039 268523 656802
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 360439 139058 2.592 0.0166 *
## p_mes 4775 1296 3.684 0.0013 **
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 402900 on 22 degrees of freedom
## Multiple R-squared: 0.3815, Adjusted R-squared: 0.3534
## F-statistic: 13.57 on 1 and 22 DF, p-value: 0.001301
# REGRESIÓN POLINÓMICA (grado 2)
modelo_poly <- lm(energia_hidraulica ~ poly(p_mes, 2), data = df_merged)
summary(modelo_poly)
##
## Call:
## lm(formula = energia_hidraulica ~ poly(p_mes, 2), data = df_merged)
##
## Residuals:
## Min 1Q Median 3Q Max
## -828093 -160412 55901 194753 449458
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 773498 68911 11.225 2.47e-10 ***
## poly(p_mes, 2)1 1484078 337595 4.396 0.000252 ***
## poly(p_mes, 2)2 -1085168 337595 -3.214 0.004162 **
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 337600 on 21 degrees of freedom
## Multiple R-squared: 0.5855, Adjusted R-squared: 0.546
## F-statistic: 14.83 on 2 and 21 DF, p-value: 9.65e-05
ggplot(df_merged, aes(x = p_mes, y = energia_hidraulica)) +
geom_point(color = "black", size = 3) +
stat_smooth(method = "lm", se = FALSE, color = "red", linetype = "dashed") + # Lineal
stat_smooth(method = "lm", formula = y ~ poly(x, 2), se = FALSE, color = "blue") + # PolinĂłmico
labs(title = "RegresiĂłn lineal vs polinĂłmica: energĂa hidráulica vs precipitaciĂłn",
x = "PrecipitaciĂłn mensual (mm)", y = "EnergĂa hidráulica (GWh)") +
theme_minimal()
## `geom_smooth()` using formula = 'y ~ x'
1. Modelo lineal simple
El modelo lineal presenta una relaciĂłn creciente entre ambas variables, pero con una capacidad explicativa limitada:
R² ajustado: 0.353 p-valor: 0.0013, lo que indica significancia estadĂstica. Los residuos muestran cierta curvatura, lo que sugiere que el modelo no captura bien la forma real de la relaciĂłn.
Para mejorar el ajuste, se aplicĂł un modelo de regresiĂłn polinĂłmica de segundo grado, con los siguientes resultados:
R² ajustado: 0.546, una mejora notable frente al modelo lineal. Ambos coeficientes (p_mes y p_mes²) resultaron estadĂsticamente significativos (p < 0.01). El gráfico muestra claramente cĂłmo el modelo polinĂłmico se ajusta mejor al comportamiento de los datos, capturando un efecto de saturaciĂłn o techo en la producciĂłn hidráulica.
El modelo polinĂłmico refleja mejor la realidad fĂsica del sistema hidráulico. Inicialmente, más precipitaciĂłn produce más energĂa, pero llega un punto donde los embalses están llenos o se limitan por gestiĂłn, lo que reduce el efecto marginal del agua caĂda. Esto se visualiza como una curva creciente que luego se estabiliza o decrece levemente.
De cara a futuras mejoras del modelo, se propone entrenar sobre datos histĂłricos correspondientes al año 2023 y validar con datos del año 2024 (completo o parcial), lo que permitirĂa evaluar su capacidad predictiva. Este enfoque requiere estructurar los datos en una serie temporal univariante y modelar explĂcitamente la estacionalidad del sistema, aspecto fundamental dado que el modelo actual no la contempla y, por tanto, no puede anticipar adecuadamente los patrones futuros. Esta metodologĂa permitirĂa además calcular el error de predicciĂłn y disponer asĂ de un modelo de referencia más robusto.
df_merged <- df_merged %>%
mutate(mes = lubridate::month(fecha),
estacion = case_when(
mes %in% c(12, 1, 2) ~ "Invierno",
mes %in% c(3, 4, 5) ~ "Primavera",
mes %in% c(6, 7, 8) ~ "Verano",
mes %in% c(9, 10, 11) ~ "Otoño"
))
ggplot(df_merged, aes(x = estacion, y = energia_hidraulica, fill = estacion)) +
geom_boxplot() +
labs(title = "DistribuciĂłn de energĂa hidráulica por estaciĂłn en Galicia",
x = "EstaciĂłn", y = "EnergĂa hidráulica (GWh)") +
theme_minimal()
AquĂ, observamos que el comportamiento estacional de la energĂa
hidráulica en Galicia está claramente condicionado por el régimen
climático. Invierno es, con diferencia, la estación más productiva,
mientras que en verano la generación hidráulica cae drásticamente. Este
patrĂłn coincide con la distribuciĂłn esperada de precipitaciones en el
clima atlántico húmedo gallego.
Tras haber demostrado una relaciĂłn significativa y tĂ©cnicamente fundamentada entre la precipitaciĂłn mensual y la energĂa hidráulica generada en Galicia, se procede a replicar el análisis sobre otra comunidad con alta producciĂłn hidroelĂ©ctrica: Castilla y LeĂłn. Esta comparaciĂłn permite validar si el patrĂłn identificado en Galicia es extrapolable a otras regiones con condiciones climáticas y de generaciĂłn similares, fortaleciendo asĂ la robustez de las conclusiones obtenidas.
# Rutas a los JSON descargados
ruta_2023 <- "data/aemet/LEON/2023.json"
ruta_2024 <- "data/aemet/LEON/2024.json"
# Cargar y convertir a data frame
datos_2023 <- fromJSON(ruta_2023)
datos_2024 <- fromJSON(ruta_2024)
df_2023 <- as.data.frame(datos_2023, stringsAsFactors = FALSE)
df_2024 <- as.data.frame(datos_2024, stringsAsFactors = FALSE)
# Convertir la columna 'fecha' al formato Date
df_2023 <- df_2023 %>% mutate(fecha = as.Date(paste0(fecha, "-01")))
df_2024 <- df_2024 %>% mutate(fecha = as.Date(paste0(fecha, "-01")))
# Ordenar por fecha
df_2023 <- arrange(df_2023, fecha)
df_2024 <- arrange(df_2024, fecha)
df_2023 <- df_2023[-nrow(df_2023), ]
df_2024 <- df_2024[-nrow(df_2024), ]
# Aplicar limpieza a todas las columnas menos fecha e indicativo
columnas_a_limpiar <- setdiff(names(df_2023), c("fecha", "indicativo"))
df_2023[columnas_a_limpiar] <- lapply(df_2023[columnas_a_limpiar], limpiar_valor)
df_2024[columnas_a_limpiar] <- lapply(df_2024[columnas_a_limpiar], limpiar_valor)
# Unir ambos años y guardar el combinado
df_clima_coruna <- bind_rows(df_2023, df_2024) %>%
arrange(fecha)
write_csv(df_clima_coruna, "data/aemet/LEON/clima_leon.csv")
Aplicamos lo mismo que para galicia:
#combinar datos df_clima por fecha con df_hidraulica_comunidades
df_clima <- read_csv("data/aemet/LEON/clima_leon.csv", show_col_types = FALSE)
df_comunidades <- read_csv("data/generacion_todas_comunidades.csv")
## Rows: 3480 Columns: 4
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr (2): variable, comunidad
## dbl (1): valor
## date (1): fecha
##
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
# Filtrar solo hidráulica y Galicia
df_hidraulica_galicia <- df_comunidades %>%
filter(variable == "Hidráulica", comunidad == "Castillayleon") %>%
select(fecha, energia_hidraulica = valor)
# Unir datasets por fecha
df_merged <- df_clima %>%
inner_join(df_hidraulica_galicia, by = "fecha")
# Verificar que ha funcionado
print(df_merged)
## # A tibble: 24 Ă— 44
## fecha indicativo p_max n_cub glo hr n_gra n_fog inso q_max q_mar
## <date> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 2023-01-01 2661 10.8 7 22953 80 0 6 5.9 929. 1025.
## 2 2023-02-01 2661 4 3 NA 60 0 0 8 929. 1026
## 3 2023-03-01 2661 11 NA 45833 63 0 0 7.7 920. 1017.
## 4 2023-04-01 2661 4.2 4 62687 48 0 1 10.3 921. 1015.
## 5 2023-05-01 2661 5.9 4 73471 53 0 0 10.4 920. 1016.
## 6 2023-06-01 2661 14.8 7 74440 58 1 1 10.8 922. 1013.
## 7 2023-07-01 2661 0 1 87112 45 0 0 12.9 919. 1014.
## 8 2023-08-01 2661 1.5 1 76424 42 0 0 12.2 921. 1014.
## 9 2023-09-01 2661 38.6 6 51383 65 0 0 8.3 922. 1015.
## 10 2023-10-01 2661 29.3 9 33702 70 0 2 5.7 923 1012.
## # ℹ 14 more rows
## # ℹ 33 more variables: q_med <dbl>, tm_min <dbl>, ta_max <dbl>, ts_min <dbl>,
## # nt_30 <dbl>, nv_0050 <dbl>, n_des <dbl>, np_100 <dbl>, n_nub <dbl>,
## # p_sol <dbl>, np_001 <dbl>, ta_min <dbl>, e <dbl>, np_300 <dbl>,
## # nv_1000 <dbl>, p_mes <dbl>, n_llu <dbl>, n_tor <dbl>, w_med <dbl>,
## # nt_00 <dbl>, ti_max <dbl>, n_nie <dbl>, tm_mes <dbl>, tm_max <dbl>,
## # nv_0100 <dbl>, q_min <dbl>, np_010 <dbl>, nw_55 <dbl>, w_racha <dbl>, …
# Correlación básica
cor.test(df_merged$p_mes, df_merged$energia_hidraulica, method = "spearman")
##
## Spearman's rank correlation rho
##
## data: df_merged$p_mes and df_merged$energia_hidraulica
## S = 1900, p-value = 0.4146
## alternative hypothesis: true rho is not equal to 0
## sample estimates:
## rho
## 0.173913
cor.test(df_merged$n_llu, df_merged$energia_hidraulica, method = "spearman")
## Warning in cor.test.default(df_merged$n_llu, df_merged$energia_hidraulica, :
## Cannot compute exact p-value with ties
##
## Spearman's rank correlation rho
##
## data: df_merged$n_llu and df_merged$energia_hidraulica
## S = 2264.3, p-value = 0.9426
## alternative hypothesis: true rho is not equal to 0
## sample estimates:
## rho
## 0.01551714
cor.test(df_merged$np_010, df_merged$energia_hidraulica, method = "spearman")
## Warning in cor.test.default(df_merged$np_010, df_merged$energia_hidraulica, :
## Cannot compute exact p-value with ties
##
## Spearman's rank correlation rho
##
## data: df_merged$np_010 and df_merged$energia_hidraulica
## S = 1458.1, p-value = 0.07857
## alternative hypothesis: true rho is not equal to 0
## sample estimates:
## rho
## 0.3660226
cor.test(df_merged$p_max, df_merged$energia_hidraulica, method = "spearman")
##
## Spearman's rank correlation rho
##
## data: df_merged$p_max and df_merged$energia_hidraulica
## S = 2120, p-value = 0.7156
## alternative hypothesis: true rho is not equal to 0
## sample estimates:
## rho
## 0.07826087
df_cor <- df_merged %>%
select(p_mes, n_llu, np_010, p_max, energia_hidraulica)
cor_matrix <- cor(df_cor, use = "complete.obs", method = "spearman")
corrplot(cor_matrix, method = "color", type = "upper", tl.col = "black")
# Escala de transformaciĂłn para doble eje
factor_escala <- max(df_merged$energia_hidraulica, na.rm = TRUE) / max(df_merged$p_mes, na.rm = TRUE)
# Crear dataframe largo para facilitar la leyenda
df_plot <- df_merged %>%
select(fecha, energia_hidraulica, p_mes) %>%
mutate(p_mes_escalado = p_mes * factor_escala) %>%
select(fecha, energia_hidraulica, p_mes_escalado) %>%
pivot_longer(cols = c("energia_hidraulica", "p_mes_escalado"),
names_to = "variable",
values_to = "valor")
# Etiquetas más legibles
df_plot$variable <- recode(df_plot$variable,
"energia_hidraulica" = "EnergĂa hidráulica (GWh)",
"p_mes_escalado" = "PrecipitaciĂłn mensual (mm)")
# Gráfico con leyenda
ggplot(df_plot, aes(x = fecha, y = valor, color = variable, linetype = variable)) +
geom_line(size = 1.2) +
scale_color_manual(values = c("EnergĂa hidráulica (GWh)" = "darkblue",
"PrecipitaciĂłn mensual (mm)" = "darkgreen")) +
scale_linetype_manual(values = c("EnergĂa hidráulica (GWh)" = "solid",
"PrecipitaciĂłn mensual (mm)" = "dashed")) +
scale_y_continuous(
name = "EnergĂa hidráulica (GWh)",
sec.axis = sec_axis(~ . / factor_escala, name = "PrecipitaciĂłn mensual (mm)")
) +
scale_x_date(date_labels = "%b %Y", date_breaks = "1 month") +
labs(title = "RelaciĂłn mensual entre energĂa hidráulica y precipitaciĂłn en Galicia",
x = "Mes", color = "Variable", linetype = "Variable") +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1))
df_merged <- df_merged %>%
mutate(mes = lubridate::month(fecha),
estacion = case_when(
mes %in% c(12, 1, 2) ~ "Invierno",
mes %in% c(3, 4, 5) ~ "Primavera",
mes %in% c(6, 7, 8) ~ "Verano",
mes %in% c(9, 10, 11) ~ "Otoño"
))
ggplot(df_merged, aes(x = estacion, y = energia_hidraulica, fill = estacion)) +
geom_boxplot() +
labs(title = "DistribuciĂłn de energĂa hidráulica por estaciĂłn en Galicia",
x = "EstaciĂłn", y = "EnergĂa hidráulica (GWh)") +
theme_minimal()
# REGRESIÓN LINEAL SIMPLE
modelo_lineal <- lm(energia_hidraulica ~ p_mes, data = df_merged)
summary(modelo_lineal) # Muestra coeficientes, R², p-valores
##
## Call:
## lm(formula = energia_hidraulica ~ p_mes, data = df_merged)
##
## Residuals:
## Min 1Q Median 3Q Max
## -394214 -211380 -59468 147449 539901
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 608302.5 95541.8 6.367 2.09e-06 ***
## p_mes 798.5 1723.9 0.463 0.648
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 291300 on 22 degrees of freedom
## Multiple R-squared: 0.009659, Adjusted R-squared: -0.03536
## F-statistic: 0.2146 on 1 and 22 DF, p-value: 0.6478
# REGRESIÓN POLINÓMICA (grado 2)
modelo_poly <- lm(energia_hidraulica ~ poly(p_mes, 2), data = df_merged)
summary(modelo_poly)
##
## Call:
## lm(formula = energia_hidraulica ~ poly(p_mes, 2), data = df_merged)
##
## Residuals:
## Min 1Q Median 3Q Max
## -355900 -227643 -17450 234304 415954
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 642941 53450 12.029 6.97e-11 ***
## poly(p_mes, 2)1 134946 261848 0.515 0.6117
## poly(p_mes, 2)2 -653687 261848 -2.496 0.0209 *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 261800 on 21 degrees of freedom
## Multiple R-squared: 0.2363, Adjusted R-squared: 0.1636
## F-statistic: 3.249 on 2 and 21 DF, p-value: 0.05898
ggplot(df_merged, aes(x = p_mes, y = energia_hidraulica)) +
geom_point(color = "black", size = 3) +
stat_smooth(method = "lm", se = FALSE, color = "red", linetype = "dashed") + # Lineal
stat_smooth(method = "lm", formula = y ~ poly(x, 2), se = FALSE, color = "blue") + # PolinĂłmico
labs(title = "RegresiĂłn lineal vs polinĂłmica: energĂa hidráulica vs precipitaciĂłn",
x = "PrecipitaciĂłn mensual (mm)", y = "EnergĂa hidráulica (GWh)") +
theme_minimal()
## `geom_smooth()` using formula = 'y ~ x'